package br.com.freelancer.util;

import java.text.Normalizer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang3.text.WordUtils;

public class StringHelper {
	
    /**
     * Valida o formato da String, verificando se tem numeros ou caracteres especiais
     * 
     * @param str
     * @return
     */
    public static boolean validaStringSemNumerosSemCarateresEspeciais(String str) {
    	
    	if (str == null) return true;
    	
		Pattern pAlpha = Pattern.compile("^[A-Za-zãÃáÁàÀêÊéÉèÈíÍìÌôÔõÕóÓòÒúÚùÙûÛçÇ ]+$");  
		Matcher mAlpha = pAlpha.matcher(str);

		return mAlpha.matches();
	}
    
    /**
     * Retorna a string truncada com seu tamanho maximo.
     * Os parametros <code>beginIndex</code> e <code>endIndex</code> são os mesmos da funcao {@link String#substring(int beginIndex, int endIndex)}
     * @param string A string a ser truncada
     * @param beginIndex   
     * @param endIndex 
     * @return a string resultante
     * @see String#substring(int, int)
     */
    public static String retornaTamMaxString(String string, final Integer beginIndex, final Integer endIndex) {
    	if (ObjectHelper.isNotEmpty(string)) {
    		return string.length()<endIndex?string:string.substring(beginIndex, endIndex);
    	}
		return string;
    }
    
    /**
     * Substitui todos os caracteres especiais da palavra por caracteres comuns.
     * Ex: 'doação' retorna 'doacao'
     * @param s a String a ser normalizada
     * @return a string com os caracteres substituidos
     */
	public static String replaceEspeciais(String s) { 
		if (ObjectHelper.isEmpty(s)) return "";

		String temp = Normalizer.normalize(s, java.text.Normalizer.Form.NFD);  
		return temp.replaceAll("[^\\p{ASCII}]","");  
	}
	
	/**
	 * Coloca apenas a primeira letra da string em maiúscula
	 * @param s
	 * @return
	 */
    public static String capitalizeFirstLetterInString(String s) {
    	if (ObjectHelper.isEmpty(s)) return "";
    	
        return WordUtils.capitalizeFully(s);
	}
    
    /**
     * Retorna a frase com a primeira letra maiúscula de cada palavra e deixa o resto em minuscula" 
     * Ex.: "Este é um EXEMPLO de FraSE" retorna "Este É Um Exemplo De Frase"
     * @param s a 
     * @return
     */
    public static String normalizaString(String s) {
		if (ObjectHelper.isEmpty(s)) return "";
    	return Normalizer.normalize(WordUtils.capitalizeFully(s), java.text.Normalizer.Form.NFD);  
    }
    
    /**
     * Retorna uma string para utilização em classes CSS. Substitui caracteres especiais, remove espacos e os transforma em underscore e deixa todas as letras minúsculas.
     * @param s A string a ser transformada em classe CSS.
     * @return o nome da classe CSS obtido
     */
    public static String geraNomeClasseCss (String s) {
    	if (ObjectHelper.isEmpty(s)) return "";
    	return replaceEspeciais(s).replace(" ", "_").replaceAll("[^\\w\\s]+","").toLowerCase();
    	
    }
    
    /**
     * Retorna uma string para utilização em classes CSS. Substitui caracteres especiais, remove espacos e deixa apenas as primeras letras maiusculas e o resto em minuscula.
     * @param s A string a ser transformada em classe CSS.
     * @return o nome da classe CSS obtido
     */
    public static String geraNomeClasseCssSemEspaco (String s) {
    	if (ObjectHelper.isEmpty(s)) return "";
    	return normalizaString(replaceEspeciais(s)).replace(" ", "").replaceAll("[^\\w\\s]+","");
    }
}
